/*
 * lcstr.h
 *
 *  Created on: Dec 1, 2010
 *      Author: cumeo89
 */

#ifndef LCSTR_H_
#define LCSTR_H_

#include "suffixtree.h"

/**
 * Chứa dữ liệu về một xâu con chung.
 */
typedef struct {

	/**
	 * Độ dài của xâu con chung
	 */
	gint length;

	const gchar *_string;

	/**
	 * Nội dung xâu con chung, được sao chép từ xâu ban đầu và cần
	 * được giải phóng.
	 */
	gchar *_substring;

	/**
	 * Chỉ số kết thúc của xâu con chung trong xâu gốc, được dùng
	 * trong quá trình xây dựng, khi đã tách được xâu con chung
	 * rồi biến này không cần đến nữa.
	 */
	glong _end;

} CommonString;

void cs_free(CommonString *cs, int K);

char *cs_get_substring(CommonString *cs);

/**
 * Trả về các xâu con chung dài nhất của K xâu chứa trong mảng strings.
 * Mảng này cần được kết thúc bằng con trỏ NULL nếu không thuật toán sẽ
 * đọc dữ liệu không biết trước trong bộ nhớ.
 * @return Mảng dữ liệu về xâu con chung dài nhất, cần được giải phỏng
 * bằng hàm cs_free.
 * @see cs_free()
 */
CommonString *find_lcstr(const gchar **strings);

/**
 * Tương tự như hàm find_lcstr nhưng sử dụng callback và userData trong
 * quá trình dựng cây hậu tố tổng quát.
 * @see find_lcstr()
 */
CommonString *find_lcstr_callback(const gchar **strings, TreeConstructionCallback callback, gpointer userData);

/**
 * Tương tự như hàm find_lcstr nhưng sử dụng cây hậu tố tổng quát có sẵn.
 * Người gọi hàm này có trách nhiệm dựng cây hậu tố của các chuỗi và đảm
 * bảo cây hậu tố đó là chính xác.
 * @see find_lcstr()
 */
CommonString *find_lcstr_tree(const gchar **strings, SuffixTree *tree);

#endif /* LCSTR_H_ */
